<?php

//简易MVC框架

date_default_timezone_set('PRC');

define("APP_ROOT",dirname(__FILE__));

/**
 * @todo 可配置项
 */
const APP_FOLDER = "app";  //APP目录名
const DEFAULT_CONTROLLER = "Index";  //默认控制器
const DEFAULT_ACTION = "index";  //默认操作
const SUFFIX_CONTROLLER = "Controller";  //控制器后缀，如果控制器名称和关键字有冲突，可以附加该后缀
const SUFFIX_ACTION = "Action";  //操作名后缀，如果操作名和关键字有冲突，可以附加该后缀

if(file_exists('./vendor/autoload.php')) {
    require_once './vendor/autoload.php';
}

/**
 * 系统错误处理
 */
set_error_handler(function($errno, $errstr, $errfile = null, $errline = 0, array $errcontext = []){
    echo "errno : {$errno}<br/>\r\n";
    echo "errstr : {$errstr}<br/>\r\n";
    echo "errfile : {$errfile}<br/>\r\n";
    echo "errline : {$errline}<br/>\r\n";
    echo "errcontext : <br/>\r\n";
    var_dump($errcontext);
    //die();
    //return false;  //return false将显示$php_errormsg
},  E_ALL);

/**
 * 系统异常处理
 */
set_exception_handler(function (Throwable $exception){
    var_dump($exception);
    echo "Uncaught exception: " , $exception->getMessage(), "\n";
});

/**
 * 注册自动加载
 * @todo 可以定义到composer
 */
spl_autoload_register(function ($class_name){
    //echo $class_name . "\r\n";
	$file_lib = APP_ROOT . str_replace('\\', DIRECTORY_SEPARATOR, "/lib/{$class_name}.php");
	//var_dump($file_lib);
	if(is_file($file_lib)){
	    //echo 'cfz1';
		require_once $file_lib;
	}else{
        //var_dump($file_lib);
        //echo 'cfz2' . "\r\n";
		$file_def = APP_ROOT . str_replace('\\', DIRECTORY_SEPARATOR, "/{$class_name}.php");
		//echo $file_def . "\r\n";
		if(is_file($file_def)){
			require_once $file_def;
		}
	}
});

/**
 * 注册结束处理方法
 */
register_shutdown_function(function(){
    //可以在此进行最终LOG写入
    //echo 'FIZE DONE!';
});

$c = $_GET['c'] ?? DEFAULT_CONTROLLER;                 //控制器
$a = $_GET['a'] ?? DEFAULT_ACTION;                     //操作

/**
 * 自定义404页面
 */
function show_404(){
	echo '404';
	die();
}

//trigger_error('测试自定义错误', E_USER_ERROR);

//throw new Exception('测试自定义异常', 110);

$class = APP_FOLDER . "\\controller\\" . ucfirst($c) . SUFFIX_CONTROLLER;
if(!class_exists($class)) {
    $class = APP_FOLDER . "\\controller\\" . ucfirst($c);
    if(!class_exists($class)) {
        show_404();
    }
}
$action = $a . SUFFIX_ACTION;
if(!method_exists($class, $action)){
    $action = $a;
    if(!method_exists($class, $action)){
        show_404();
    }
}
$controller = new $class();
$controller->$action();
